package com.example.okhttp;

import java.io.BufferedOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author:0.2℃
 * @date： 2022-01-04 19:15
 * @version:
 * @Description ：
 */
public class JsonHttpRequest implements IHttpRequest{
    private String url;
    private byte[] data;
    private CallbackListener listener;
    @Override
    public void setURL(String url) {
        this.url = url;
    }

    @Override
    public void setData(byte[] data) {
        this.data = data;

    }

    @Override
    public void setListener(CallbackListener callbackListener) {
        this.listener = callbackListener;
    }

    private HttpURLConnection urlConnection;
    /**
     * 访问网络的具体操作
     */
    @Override
    public void execute() {
        URL url = null;
        try {
            url = new URL(this.url);
            urlConnection = (HttpURLConnection) url.openConnection();   // 打开http连接
            urlConnection.setConnectTimeout(6000); // 连接的超时时间
            urlConnection.setUseCaches(false); // 不使用缓存
            urlConnection.setInstanceFollowRedirects(true); // 是成员函数，仅作用于当前函数，设置这个连接是否可以被重定向
            urlConnection.setReadTimeout(3000);// 设置响应超时时间
            urlConnection.setDoInput(true); // 设置这个连接是否可以写入数据
            urlConnection.setRequestMethod("POST"); // 设置请求方式
            urlConnection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");// 设置消息类型
            urlConnection.connect();   // 开始连接，从上述至此的配置必须在connect之前完成，实际上它只是建立了一个与服务器的TCP连接
            //----------------------使用字节流发送数据----------------------------
            OutputStream os = urlConnection.getOutputStream();
            BufferedOutputStream bos = new BufferedOutputStream(os);    // 使用缓冲节流包装字节流
            bos.write(data); // 把这个字节数据写入缓冲区
            bos.flush(); // 刷新缓冲区，发送数据
            os.close();
            bos.close();
            //----------------------使用字符流写入数据
            if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream in = urlConnection.getInputStream();
                listener.onSuccess(in);
            } else {
                throw new RuntimeException("请求失败");
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("请求失败");
        } finally {
            urlConnection.disconnect();
        }
    }
}
